package com.open.basic.json;


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.List;
import java.util.Map;

public class JsonHelper {

    private static final JsonClientImpl jsonClient;

    static {
        jsonClient = new JsonClientImpl();
        jsonClient.init();
    }

    private JsonHelper(){

    }

    /**
     * 将对象转换json形式
     *
     * @param obj 输入的对象
     * @return json字符串
     */
    public static String toJson(Object obj) {
        return jsonClient.toJson(obj);
    }

    /**
     * json字符串转换为对象
     *
     * @param json  json字符串
     * @param clazz 要转换的简单对象类型
     * @param <T>   对象类型
     * @return 对象
     */
    public static <T> T fromJson(String json, Class<T> clazz) {
        return jsonClient.fromJson(json, clazz);
    }

    /**
     * 转换为对象列表
     *
     * @param json  json 字符串
     * @param clazz 对象列项
     * @param <T>   对象类型
     * @return 对象列表
     */
    public static <T> List<T> toList(String json, Class<T> clazz) {
        return jsonClient.toList(json, clazz);
    }

    /**
     * json转换为Map对象
     *
     * @param json       json字符串
     * @param keyClazz   key对象类型
     * @param valueClazz 值对象类型
     * @param <K>        map的key类型
     * @param <V>        map的值类型
     * @return map
     */
    public static <K, V> Map<K, V> toMap(String json, Class<K> keyClazz, Class<V> valueClazz) {
        return jsonClient.toMap(json, keyClazz, valueClazz);
    }

    public static JsonNode toJsonNode(String json)  {
        try {
            return jsonClient.toJsonNode(json);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    public static ObjectNode toObjectNode(String json) throws JsonProcessingException {
        return jsonClient.toObjectNode(json);
    }

    public static ObjectNode toObjectNode(JsonNode jsonNode) {
        return jsonClient.toObjectNode(jsonNode);
    }

    public static ObjectNode toObjectNode(Map map) {
        return jsonClient.toObjectNode(map);
    }

    public static ObjectNode createJsonNode() {
        return jsonClient.createJsonNode();
    }
}
